#pragma once
#include <windows.h>

// ================================================================================================
// High Resolution timer
// ================================================================================================
class CHRTimer {

    private: 

        LARGE_INTEGER resolution;
        LARGE_INTEGER tickcount;
        double seconds;
        double ms;
    public:

        // -- default constructor
        CHRTimer();
        
        // -- public interface
        void RememberTime();

        // -- accessor functions
        double GetSeconds();
        double GetMS();
};

// ================================================================================================
// The default constructor
// ================================================================================================
inline CHRTimer::CHRTimer() {
    QueryPerformanceFrequency(&resolution);
}

// ================================================================================================
// Remember the time
// ================================================================================================
inline void CHRTimer::RememberTime() {
    QueryPerformanceCounter(&tickcount);

    seconds = double(tickcount.QuadPart)/double(resolution.QuadPart);
    ms = seconds * 1000.0;
}

// ================================================================================================
// Accessor functions
// ================================================================================================
inline double CHRTimer::GetSeconds() {
    return seconds;
}

inline double CHRTimer::GetMS() {
    return ms;
}

#include "chrtimer.h"
#include <iostream>

class CStopWatch {

private:

    CHRTimer timer;
    double delsec;
    double delms;

    bool started;

public:

    CStopWatch();
    void StartClock();
    void Click();

    double GetDeltaSeconds();
    double GetDeltaMS();
    bool AlreadyStarted();
};

// ================================================================================================
// Default constructor
// ================================================================================================
inline CStopWatch::CStopWatch() : delsec(0.0), delms(0.0), started(false) {
}

// ================================================================================================
// Start the clock
// ================================================================================================
inline void CStopWatch::StartClock() {
    if(started) 
        return;

    started = true;
    timer.RememberTime();
}

// ================================================================================================
// Poll the clock and set the delta time
// ================================================================================================
inline void CStopWatch::Click() {
    if(!started) 
        return;

    double sec1 = timer.GetSeconds();
    double ms1 = timer.GetMS();
    timer.RememberTime();
    double sec2 = timer.GetSeconds();
    double ms2 = timer.GetMS();

    delms = ms2 - ms1;
    delsec = sec2 - sec1; 
}

// ================================================================================================
// Get the delta seconds
// ================================================================================================
inline double CStopWatch::GetDeltaSeconds() {
    return delsec;
}

// ================================================================================================
// Get the delta seconds
// ================================================================================================
inline double CStopWatch::GetDeltaMS() {
    return delms;
}

inline bool CStopWatch::AlreadyStarted() {
    return started;
}
